//call方法写在函数原型链上
//第一个参数为this的指向，之后的参数用...rest
Function.prototype.myCall = function (ctx, ...rest) {
    // //把this放到ctx的属性里面，但是不能重名然后通过属性调用函数
    // ctx.fn = this
    // //使用扩展运算符传入参数
    // ctx.fn(...rest)
    // //删除属性
    // delete ctx.fn


    ctx = (ctx === null || ctx === undefined) ? globalThis : Object(ctx)
    //用来确保ctx下的属性不会重名
    let key = Symbol('key')
    //属性描述符，使返回的数据成为对象
    Object.defineProperty(ctx, key, {
        enumeralie: false,
        value: this
    })
    //使用扩展运算符传入参数
    let result = ctx[key](...rest)
    //删除属性
    delete ctx[key]
    return result
}
function fn(a, b) {
    console.log(this, a, b);
    return a + b
}
fn.myCall({}, 1, 2)